/***
@autor: Paul Gualambo Giraldo
@version: General-2.1
Para la recepcion de los datos
*/
/////////////////////////////////////////////////////////////////

var General = {
    ERROR: 0,
    EXITO: 1,
    SINACCESO: 2,
    NOSESSION: 3,
    PAGE_NOSESSION: ""
};
/////////////////////////////////////////////////////////////////

var Urls = function () {
    this.List = "";
    this.Form = "";
    this.Register = "";
    this.Eliminar = "";

};

$(document).ready(function () {

    var modal = null;
    $(document).ajaxSend(function (event, request, settings) {

        var cadena = settings.data + "";
        if (cadena.search("_cargarLoadingModal=1") > 0) {

            var matenimiento = new Mantenimiento();
            modal = matenimiento._getModalV2();
            modal.find(".modal-footer").hide();
            modal.find(".modal-header").hide();
            html = '<h3>La operaci&oacute;n se esta ejecutando por favor espere.</h3><div class="progress progress-striped active"><div class="bar" style="width: 100%;"></div></div>';
            modal.find(".modal-body").html(html);
            modal.modal("show");
        }
    });

    $(document).ajaxComplete(function (event, xhr, settings) {
        var cadena = settings.data + "";
        if (cadena.search("_cargarLoadingModal=1") > 0) {
            if (modal != null) {
                modal.modal('hide');
            }
        }
    });

});

var Modal = {
    BIG: {
        'top': "100px",
        'width': '800px',
        'margin-left': function () {
            return -($(this).width() / 2);
        }
    },

    MEDIUM: {
        'top': "100px",
        'width': '600px',
        'margin-left': function () {
            return -($(this).width() / 2);
        }
    },

    SMALL: {
        'top': "100px",
        'width': '400px',
        'margin-left': function () {
            return -($(this).width() / 2);
        }
    }
};

var MensajesAviso = {
    TituloEliminacion: "&iquest;Desea eliminar el registro?",
    ContenidoEliminacion: "Si el elimina el registro ya no podra recuperarlo"
};

function Mantenimiento() {

    this.CssModalForm = "";
    this.TituloModalForm = "";
    this.ModalForm = "";



    //Se debe validar que ambos combos tengan el formato correcto
    this.ValidarFechaRango = function (objInicio, objFin, format) {

        var diaFoco, mesFoco, anioFoco;
        var fechaInicio = "", fechaFin = "";
        var parts;
        if (format == "dd/mm/AAAA") {
            var fecha = objInicio.val();
            if (fecha && fecha != "") {
                parts = fecha.split("/");
                anioFoco = parts[2];
                mesFoco = parts[1];
                diaFoco = parts[0];
                fechaInicio = anioFoco + "-" + mesFoco + "-" + diaFoco;
            }

            fecha = objFin.val();
            if (fecha && fecha != "") {
                parts = fecha.split("/");
                anioFoco = parts[2];
                mesFoco = parts[1];
                diaFoco = parts[0];
                fechaFin = anioFoco + "-" + mesFoco + "-" + diaFoco;
            }
            return fechaFin > fechaInicio;
        }
    };

    //Se supone que el formato es de tipo dd/mm/AAAA
    this.ConvertFechaCombos = function (obj, format, formatDisplay, esObligatorio, rango) {
        if (!rango) {
            var rango = {
                inicio: "50",
                fin: "10"
            };
        }

        obj.hide();

        if (format == "dd/mm/AAAA") {
            var fecha = obj.val();
            var diaFoco, mesFoco, anioFoco
            if (fecha && fecha != "") {
                var parts = fecha.split("/");
                anioFoco = parts[2];
                mesFoco = parts[1];
                diaFoco = parts[0];
            }
        }

        var objhidden = obj.clone();
        var idObj = obj.attr("id");
        objhidden.attr("type", "hidden");

        var divFecha = $("<div>");
        divFecha.append(objhidden);

        var dia = $("<select>");
        dia.attr("id", idObj + "_dia");
        dia.addClass("dia");
        var diaText = $("<option>");
        diaText.val("");
        diaText.text("dd");
        dia.append(diaText);
        for (i = 1; i <= 31; i++) {
            var temp = $("<option>");
            temp.val(i);
            if (i == diaFoco) {
                temp.attr("selected", "selected");
            }
            temp.text(i <= 9 ? "0" + i : i);
            dia.append(temp);
        }
        dia.change(function () {
            var fecha = "";
            var tempDia = "1";
            var tempMes = "1";
            var tempAnio = "1984";

            if (dia.val() != "") {
                tempDia = dia.val();
            };
            if (mes.val()) {
                tempMes = mes.val();
            };
            if (anio.val()) {
                tempAnio = anio.val();
            };

            fecha = tempDia + "/" + tempMes + "/" + tempAnio;
            objhidden.val(fecha);
        });

        var mes = $("<select>");
        mes.addClass("mes");
        mes.attr("id", idObj + "_mes");
        var mesText = $("<option>");
        mesText.val("");
        mesText.text("mm");
        mes.append(mesText);
        for (i = 1; i <= 12; i++) {
            var temp = $("<option>");
            temp.val(i);
            if (i == mesFoco) {
                temp.attr("selected", "selected");
            }
            temp.text(i <= 9 ? "0" + i : i);
            mes.append(temp);
        }

        var now = new Date();
        var anioHoy = now.getFullYear();

        var anio = $("<select>");
        anio.addClass("anio");
        anio.attr("id", idObj + "_anio");
        var anioText = $("<option>");
        anioText.val("");
        anioText.text("AA");
        anio.append(anioText);

        for (i = anioHoy - rango.inicio; i <= (1) * anioHoy + (1) * rango.fin; i++) {
            var temp = $("<option>");
            temp.val(i);
            if (i == anioFoco) {
                temp.attr("selected", "selected");
            }
            temp.text(i);
            anio.append(temp);
        }

        mes.change(function () {
            dia.change();
        })

        anio.change(function () {
            dia.change();
        })

        if (formatDisplay == "mm/AAAA") {
            dia.hide();
        }

        if (esObligatorio) {
            dia.addClass("validate[required]");
            mes.addClass("validate[required]");
            anio.addClass("validate[required]");
        }

        divFecha.append(dia).append(mes).append(anio);
        obj.replaceWith(divFecha);

        return obj;
    }

    this.StyleInputFile = function (obj) {
        //var obj = $(this);

        if ($.browser.msie) {
            obj.css({
                "width": "180px",
                "margin": "0"
            });
            return;
        }

        obj.hide();
        var padre = obj.parent();

        var text = $("<input type=\"text\">");
        text.attr("id", obj.attr("id") + "_text");
        text.css({
            "width": "100px",
            "margin": "0"
        });
        text.addClass(obj.attr("class"));

        var aClick = $("<a>");
        aClick.addClass("btn");
        aClick.attr("id", obj.attr("id") + "_link");
        aClick.html("<i class=\"icon-search\"></i>");

        padre.append(text).append(aClick);

        aClick.click(function () {
            obj.click();
            setTimeout(function () {
                obj.val(obj.val());
            }, 1);
        });

        obj.change(function () {
            text.val(obj.val());
        });
    };


    this.StyleInputFile2 = function (obj) {
        //var obj = $(this);

        if ($.browser.msie) {
            obj.css({
                "width": "180px",
                "margin": "0"
            });
            return;
        }

        obj.hide();
        var objFileClone = obj.clone();

        var divContainer = $("<div style=\"float:left\">");
        divContainer.attr("id", obj.attr("id") + "_container");

        var text = $("<input type=\"text\">");
        text.attr("id", obj.attr("id") + "_text");
        text.attr("name", obj.attr("name") + "_text");
        text.attr("data-type", "file");
        text.attr("readonly", "readonly");
        text.css({
            "width": "100px",
            "margin": "0"
        });

        if (obj.attr("required")) {
            text.attr("required", "required");
        }

        text.addClass(obj.attr("class"));

        var aClick = $("<a>");
        aClick.addClass("btn");
        aClick.attr("id", obj.attr("id") + "_link");
        aClick.html("<i class=\"icon-search\"></i>");

        divContainer.append(text).append(aClick).append(objFileClone);

        aClick.click(function () {
            objFileClone.click();
        });

        objFileClone.change(function () {
            text.val(objFileClone.val());
        });

        obj.replaceWith(divContainer);
    };


    this._ValidacionExtensionArchivo = function (obj, extensionPermitidos, titulo, mensaje) {
        //Validar Extension de archivos
        var _parent = this;
        obj.change(function () {

            var val = $(this).val();

            var extension = val.substring(val.lastIndexOf('.') + 1).toLowerCase();

            var encontro = false;
            jQuery.each(extensionPermitidos, function (index, value) {
                if (value == extension) {
                    encontro = true;
                    return;
                }
            });

            if (!encontro) {
                _parent._MensajesOperacion(
                        "error", titulo, mensaje);

                //Si es ie
                if ($.browser.msie) {
                    var empty_input = obj.clone();
                    obj.replaceWith(empty_input.clone());
                } else {
                    obj.val('');

                    //Cuando existe el input file a modo style bootstrap
                    var tempText = obj.parent().find("#" + obj.attr("id") + "_text");
                    if (tempText) {
                        tempText.val("");
                    }
                }
            }
        });
    };

    this._AutoComplete = function () {

        return {
            container: "",
            input: "",
            method: "POST",
            minLength: 4,
            UrlBusqueda: "",

            Data: function () {
            },

            CargarItems: function () {
            },

            MostrarItemSeleccionado: function () {
            },

            OtrasOperaciones: function () {
            },

            AutoCompletar: function () {
                var _parent = this;

                this.input.blur(function () {
                    $(this).val('');
                });

                this.container.find(".cambiar-registro").click(function () {
                    _parent.container.find("._Busqueda").slideDown();
                    _parent.container.find("._Resultado").slideUp();

                    _parent.OtrasOperaciones();                    
                })

                this.input.autocomplete({
                    delay: 800,
                    method: _parent.method,
                    minLength: _parent.minLength,
                    source: function (request, response) {
                        $.ajax({
                            url: _parent.UrlBusqueda,
                            data: _parent.Data(),
                            dataType: "json",
                            type: "POST",
                            success: function (data) {
                                response(data);
                            }
                        });
                    },
                    focus: function (event, ui) {
                        //_parent.input.val("");
                        return false;
                    },
                    select: function (event, ui) {
                        _parent.MostrarItemSeleccionado(ui);
                        return false;
                    }
                }).data("autocomplete")._renderItem = function (ul, item) {

                    return $("<li></li>")
        	.data("item.autocomplete", item)
        	.append(_parent.CargarItems(item))
        	.appendTo(ul);
                };
            }
        }
    };

    this._MensajeConfirmacion = function () {
        return {
            titulo: MensajesAviso.TituloEliminacion,
            contenido: MensajesAviso.ContenidoEliminacion,
            getModal: "",
            //Logica de yes
            yes: function () { },
            //Logica de yes
            no: function () {
                this.getModal.modal('hide');
            },

            modal: function () {

                var _parent = this;
                var img = URL_PAGE + "Content/base/images/Icono_question.png";
                var titulo = this.titulo;
                var mensaje = this.contenido;

                var alert = $("#alert-contenido");
                var modal = $("<div>").attr("id", "alert-general").attr("class", "modal hide fade");
                jQuery("body").append(modal);

                modal.html(alert.html());
                modal.find(".alert").addClass("alert-info");
                modal.find("img").attr("src", img);
                modal.find(".titulo").html(titulo);
                modal.find(".contenido").html(mensaje);
                modal.find(".botones").show();

                modal.modal({
                    keyboard: true,
                    backdrop: true
                });

                modal.on('hidden', function () {
                    modal.remove();
                })

                modal.find("button.close").unbind();
                modal.find("button.close").click(function () {
                    modal.modal('hide');
                });

                modal.find("#no").click(function () {
                    _parent.no();
                });

                modal.find("#si").click(function () {
                    _parent.yes();
                });

                this.getModal = modal;
            }
        }
    }

//    this._MensajesOperacion = function (tipoMensajeM, tituloM, contenidoM, tiempo) {
//        var img = URL_PAGE + "Content/base/images/Icono_" + tipoMensajeM + ".png";
//        var titulo = tituloM;
//        var mensaje = contenidoM;
//        var tipoMensaje = tipoMensajeM;

//        var alert = $("#alert-contenido");
//        var modal = $("<div>").attr("id", "alert-general").attr("class", "modal hide fade");
//        jQuery("body").append(modal);

//        modal.html(alert.html());
//        modal.find(".alert").addClass("alert-" + tipoMensaje);
//        modal.find("img").attr("src", img);
//        modal.find(".titulo").html(titulo);
//        modal.find(".contenido").html(mensaje);
//        modal.find(".botones").hide();

//        modal.css({
//            'z-index': "9999"
//        });

//        modal.modal({
//            backdrop: false
//        });

//        modal.on('hide', function () {
//            modal.remove();
//        })

//        modal.find("button.close").unbind();
//        modal.find("button.close").click(function () {
//            modal.modal('hide');
//        });

//        if (!tiempo) {
//            tiempo = 3000;
//        }

//        setTimeout(
//            function () {
//                //console.log(modal);
//                modal.modal('hide');
//            }, tiempo);
//    }

    this._MensajesOperacion = function (tipoMensajeM, tituloM, contenidoM, tiempo) {
        var img = URL_PAGE + "Content/base/images/Icono_" + tipoMensajeM + ".png";
        var titulo = tituloM;
        var mensaje = contenidoM;
        var tipoMensaje = tipoMensajeM;


        var alert = '<div class="alert" ><div class="row-fluid"><button type="button" class="close" data-dismiss="alert">X</button><div class="span2"><img src="" alt=""></div><div class="span9"><p class="titulo"></p><p class="contenido"></p></div></div></div>';

        var modal;
        if (jQuery("#alert-general").length) {
            modal = jQuery("#alert-general");
        } else {
            modal = $("<div>").attr("id", "alert-general").attr("class", "modal hide fade");
        }

        jQuery("body").append(modal);

        modal.html(alert);
        modal.find(".alert").addClass("alert-" + tipoMensaje);
        modal.find("img").attr("src", img);
        modal.find(".titulo").html(titulo);
        modal.find(".contenido").html(mensaje);
        modal.find(".botones").hide();

        modal.css({
            'z-index': "2100",
            'margin-left': function () {
                return -($(this).width() / 2);
            }
        });

        modal.modal({
            backdrop: false
        });

        modal.on('hide', function () {
            modal.remove();
        })

        modal.find("button.close").unbind();
        modal.find("button.close").click(function () {
            modal.modal('hide');
        });

        if (!tiempo) {
            tiempo = 3000;
        }

        setTimeout(
            function () {
                //console.log(modal);
                modal.modal('hide');
            }, tiempo);
    }


    this._getCont = function () {
        return this._Cont;
    }

    this._getContForm = function () {
        var _parent = this;

        if (_parent._ModoNavegacion == "Modal") {
            return _parent.ModalForm;
        } else {
            return _parent._getCont().find("#_ContForm");
        }
    }

    this._getForm = function () {
        var _parent = this;

        var form = _parent._getContForm().find("#_Form")
        form.attr("action", _parent._UrlRegister);
        return form;
    }

    this._getContList = function () {
        var _parent = this;
        return _parent._getCont().find("#_ContList");
    }

    this._getContToolList = function () {
        var _parent = this;
        return _parent._getCont().find("#_ContToolList");
    }

    this._getList = function () {
        var _parent = this;
        return _parent._getContForm().find("#_List");
    }

    this._getModal = function (html) {
        var modal = $("#modal-general").html($("#modal-general-copy").html());
        modal.find(".modal-body").html(html);
        return modal;
    };

    //Obteniendo un modal
    this._getModalV2 = function (html) {

        var modal;
        var time = (new Date()).getTime();

        if (jQuery("#_modal_general" + time).length) {
            modal = jQuery("#_modal_general" + time);
        } else {
            modal = $("<div>");
            modal.attr("id", "_modal_general" + time);
            modal.attr("class", "modal hide fade");
        }
        _tempModal = '<div class="modal-header"><a class="close" data-dismiss="modal">X</a><h2></h2></div><div class="modal-body"></div><div class="modal-footer"><button type="submit" id="aceptar" class="btn btn-primary btn-large" ><i class="icon-ok icon-white"></i>&nbsp;Aceptar</button><button class="btn" data-dismiss="modal" aria-hidden="true" id="myModalClose">Cerrar</button></div>';
        modal.html(_tempModal);
        modal.find(".modal-body").html(html);
        modal.appendTo("body");
        modal.modal({
            keyboard: false,
            backdrop: 'static',
            show: false
        });
        modal.on('hidden', function () {
            jQuery("#_modal_general" + time).remove();
        });
        return modal;
    };

    this.Init = function (Cont, Urls, Modo) {
        //Prefijo
        this._Prefijo = "";

        var _parent = this;
        //Tres modos Slide, Modal, All
        this._ModoNavegacion = (Modo) ? Modo : "Slide";

        //Formulario y List
        //Es requisito que dentro del formulario se tiene un objeto con el id de aceptar
        //que sirve para enviar a registrar los datos del formulario
        this._Cont = Cont;
        if (this._Cont.attr("prefijo")) {
            this._Prefijo = this._Cont.attr("prefijo");
        }
        this.SetAttr();

        //Urls
        this._UrlList = Urls.List;
        this._UrlForm = Urls.Form;
        this._UrlRegister = Urls.Register;
        this._UrlEliminar = Urls.Eliminar;



        //Width y Height para el formulario
        this._Width = Urls.width;
        this._Height = Urls.height;
        this._Titulo = Urls.titulo;

        //Ejecutando el PreInit
        this.PreInit();
        this.InitNavegacion();
        this.Search();
        this.__CleanCadena();

        //Aceptar Nuevo y Editar
        //Creando la accion asociada al evento patron Observer
        if (Modo != "Modal") {
            this._ContForm.find("#" + this._Prefijo + "_aceptar").off();
            this._ContForm.find("#" + this._Prefijo + "_aceptar").on("click", function () {
                _parent.Register();
            });
        }


        //La Opcion de listar
        this._ContList.off("submit", "#" + this._Prefijo + "_ListForm");
        this._ContList.on("submit", "#" + this._Prefijo + "_ListForm", function () {
            //llamando al ajax para el guardado
            $(this).attr("action", _parent._UrlList);
            $(this).ajaxSubmit({
                success: function (responseText, statusTexts, xhr, $form) {
                    _parent._ContList.html(responseText);
                    _parent.SetAttr();
                }
            });
            return false;
        });

        //La Opcion de listar
        this._ContList.find("." + this._Prefijo + "_Paginador").off();
        this._ContList.find("." + this._Prefijo + "_Paginador").on("click", function () {
            _parent._ContList.find("#pagina").val($(this).attr("data-pagina"));
            _parent.List();
        });
    };

    //Seteando los atributos cadavez que lo necesitemos
    this.SetAttr = function () {
        //Concatenando el prefijo
        this._ContForm = this._Cont.find("#" + this._Prefijo + "_ContForm");
        this._Form = this._ContForm.find("#" + this._Prefijo + "_Form");
        this._ContList = this._Cont.find("#" + this._Prefijo + "_ContList");
        this._List = this._ContList.find("#" + this._Prefijo + "_List");

        //Para la paginacion
        this._ListForm = this._ContList.find("#" + this._Prefijo + "_ListForm");
        //Para las busquedas
        this._ContToolList = this._Cont.find("#" + this._Prefijo + "_ContToolList");

        //Eliminando el envio de datos por submit
        this._Form.on("submit", function () {
            return false;
        });
    }

    this.PreInit = function () {
        return true;
    };


    //Buscador el listado debe tener un formualrio
    this.Search = function () {
        var _parent = this;
        this._ContToolList.find("#cadena").on("keypress", function (event) {
            if (event.which == 13) {
                _parent._ContList.find("#pagina").val(1);
                _parent._ContList.find("#cadena").val(_parent._ContToolList.find("#cadena").val());
                _parent.List();
                _parent.ShowList();
            }
        });
    };

    this.__CleanCadena = function () {
        var _parent = this;

        this._ContToolList.find("#limpiar-cadena").off();
        this._ContToolList.find("#limpiar-cadena").on("click", function () {
            var obj = $(this);
            _parent._ContToolList.find("#cadena").val("");
            _parent._ContList.find("#cadena").val("");
        });
    };

    this.__LoadingDiv = function (_objCont) {
        var imageLoading = $("<img>");
        imageLoading.attr("src", URL_LOADING);

        var objLoading = $("<div>");

        var position = _objCont.position();
        var _height = _objCont.height();
        var _width = _objCont.width();

        var padding = "padding-top:" + _objCont.css("padding-top") + ";" + "padding-left:" + _objCont.css("padding-left") + ";" + "padding-right:" + _objCont.css("padding-right") + ";" + "padding-bottom:" + _objCont.css("padding-bottom") + ";";
        var margin = "margin-top:" + _objCont.css("margin-top") + ";" + "margin-left:" + _objCont.css("margin-left") + ";" + "margin-right:" + _objCont.css("margin-right") + ";" + "margin-bottom:" + _objCont.css("margin-bottom") + ";";

        objLoading.attr("style", padding + margin + "overflow:hidden;" + "width:" + _width + "px;min-height:32px;height:" + _height + "px;border:1px solid silver;background-color:#fff;position:absolute;top:" + position.top + "px;left:" + position.left + "px");
        objLoading.css("text-align", "center");
        objLoading.append(imageLoading);
        _objCont.append(objLoading);
    };

    this.__LoadingControl = function (_objCont) {
        var imageLoading = $("<img>");
        imageLoading.attr("src", URL_LOADING);

        var objLoading = $("<div>");

        var position = _objCont.position();
        var _height = _objCont.height();
        var _width = _objCont.width();

        var padding = "padding-top:" + _objCont.css("padding-top") + ";" + "padding-left:" + _objCont.css("padding-left") + ";" + "padding-right:" + _objCont.css("padding-right") + ";" + "padding-bottom:" + _objCont.css("padding-bottom") + ";";
        var margin = "margin-top:" + _objCont.css("margin-top") + ";" + "margin-left:" + _objCont.css("margin-left") + ";" + "margin-right:" + _objCont.css("margin-right") + ";" + "margin-bottom:" + _objCont.css("margin-bottom") + ";";

        objLoading.attr("style", padding + margin + "overflow:hidden;" + "width:" + _width + "px;min-height:25px;height:" + _height + "px;border:1px solid silver;background-color:#fff;position:absolute;top:" + position.top + "px;left:" + position.left + "px");
        objLoading.css("text-align", "center");
        objLoading.append(imageLoading);
        $("body").append(objLoading)

        return objLoading;
    };



    //Mostrando el listado para nuevo y editar
    //Cargando el listado
    this.List = function (data) {
        var _parent = this;

        _parent.__LoadingDiv(this._ContList);
        console.log(data);
        //Verificando si existe el formulario
        if (this._ContList.find("#" + this._Prefijo + "_ListForm").length != 0) {
            this._ContList.find("#" + this._Prefijo + "_ListForm").submit();
        } else {
            $.ajax({
                // Autor.
                url: this._UrlList,
                type: "post",
                data: data,
                success: function (data) {
                    _parent._ContList.html(data);
                    //Nuevamente seteando los atributos
                    _parent.SetAttr();
                }
            });
        }
    };


    //Mostrando el listado para nuevo y editar
    //Cargando el listado
    this.ListEspecial = function (data) {
        var _parent = this;

        _parent.__LoadingDiv(this._ContList);

        //Verificando si existe el formulario
        if (this._ContList.find("#" + this._Prefijo + "_ListForm").length != 0) {
            //this._ContList.find("#" + this._Prefijo + "_ListForm").submit();

            //La Opcion de listar
            var form = _parent._getContList().find("#_ListForm");

            form.attr("action", _parent._UrlList);
            form.ajaxSubmit({
                success: function (responseText, statusTexts, xhr, $form) {
                    _parent._ContList.html(responseText);
                    _parent.SetAttr();

                    if (data != null && data.idregistro != null) {
                        $.each(_parent._getContList().find("tr"), function (index, value) {

                            if ($(value).attr("data-idregistro") == data.idregistro) {
                                var color = $(this).css("background-color")
                                console.log(data);
                                console.log($(value));
                                var refreshId = setInterval(function () {
                                    $(value).animate({ backgroundColor: "#FFF8C6" }, 500, function () {
                                        $(value).animate({ backgroundColor: color }, 500);
                                    });
                                }, 1000);

                                setTimeout(function () {
                                    clearInterval(refreshId);
                                }, 8000);
                            }
                        });
                    }
                }
            });
        } else {
            $.ajax({
                // Autor.
                url: this._UrlList,
                type: "post",
                data: data,
                success: function (data) {
                    _parent._ContList.html(data);
                    //Nuevamente seteando los atributos
                    _parent.SetAttr();
                }
            });
        }
    };


    //Mostrando el formulario para nuevo y editar
    this.Form = function (data) {
        var _parent = this;

        if (this._ModoNavegacion == "All") {
            _parent.__LoadingDiv(_parent._ContForm);
            setTimeout(
            function () {
                $.ajax({
                    // Autor
                    url: _parent._UrlForm,
                    type: "post",
                    data: data,
                    success: function (data) {
                        _parent.FormNavegacion(data);
                    }
                })
            }
            , 1500
            );
        } else {
            $.ajax({
                // Autor
                url: _parent._UrlForm,
                type: "post",
                data: data,
                success: function (data) {
                    _parent.FormNavegacion(data);
                }
            })
        }
    };

    //La operacion de registrar ya sea para agregar o guardar, 
    //contiene un Validate y un PostRegister que deberian ser personalizables

    this.__Validate = function () {
        return true;
    };

    this.__PostRegister = function (data) {
        return true;
    }


    this.ValidaSession = function (data) {
        //Esto es en caso no exista el objeto del formato especificado
        return true;
    }

    //Operacion despues de registrar el evento
    this.PostRegisterNavegacion = function (data) {
        var _parent = this;
        switch (this._ModoNavegacion) {
            case "Slide":
                //_parent     
                _parent.RecepcionDataDepuesDelProcesoDelForm(data);
                _parent.List();
                break;

            case "All":
                _parent.RecepcionDataDepuesDelProcesoDelForm(data);
                _parent.List();
                break;

            case "Modal":
                _parent.List();
                break;

            case "FormuUnico":

                break;
        }
    };

    //Seteo los campos del formulario con el objeto que me devuelve el servidor
    //en formato json me servira cuando se inserta un nuevo registro
    this.RecepcionDataDepuesDelProcesoDelForm = function (data) {
        var obj = jQuery.parseJSON(data);
        var contForm = this._Form;

        $.each(obj.objeto, function (index, value) {
            contForm.find("#" + index).val(value);
        });
        return true;
    };

    this.Register = function (data) {

        var _parent = this;

        if (!this.__Validate())
            return;

        this._Form.ajaxSubmit({
            success: function (responseText, statusTexts, xhr, $form) {

                //Es la accion basica que se realiza cuando registramos en el formulario        
                _parent.PostRegisterNavegacion(responseText);

                //Este metodo es customizable para una logica especifica
                _parent.__PostRegister(responseText);
            }
        });

    };

    this.__PostCloseDialog = function (data) {
        return true;
    };

    this.__PreOpenDialog = function (data) {
        return true;
    }

    this.FormNavegacion = function (data) {
        var _parent = this;
        switch (this._ModoNavegacion) {
            case "Slide":
                _parent._ContList.slideUp(function () {
                    _parent._ContForm.html(data);
                    _parent._ContForm.slideDown();

                    //Nuevamente seteando los atributos
                    _parent.SetAttr();
                });
                break;

            case "All":

                _parent._ContForm.html(data);
                break;

            case "Modal":
                var modal = _parent._getModal(data);

                modal.find(".modal-header").find("h2").html(_parent.TituloModalForm);
                modal.css(_parent.CssModalForm);
                modal.modal();

                _parent.ModalForm = modal;
                break;
        }

        //Despues de Cargar el formulario se puede cargar los eventos 
        _parent._PostForm(data);
    };


    //Despues de cargar el formulario sirve para cargar los eventos de este
    this._PostForm = function (data) {
        return;
    }

    //
    //El iniciaizador de estos primeramente es para el modo slide
    //debe tener el id _CerrarModo
    this.InitNavegacion = function (data) {
        var _parent = this;
        switch (this._ModoNavegacion) {
            case "Slide":
                if (_parent._Cont.find("#" + this._Prefijo + "_CerrarModo")) {
                    _parent._Cont.find("#" + this._Prefijo + "_CerrarModo").on("click", function () {
                        _parent._ContForm.slideUp(function () {
                            _parent._ContList.slideDown();
                        });
                    })
                }
                break;
            case "All":
                break;
        }
    };

    this.ShowList = function () {
        var _parent = this;
        switch (this._ModoNavegacion) {
            case "Slide":
                _parent._ContForm.slideUp(function () {
                    _parent._ContList.slideDown();
                    //Nuevamente seteando los atributos
                    _parent.SetAttr();
                });
                break;

            case "All":
                _parent.SetAttr();
                break;
        }
    };



    //Funciones para el ubigeo
    this._Ubigeo = function (Urls) {
        var _parent = this;

        var idPais = Urls.idPais;
        var idDepartamento = Urls.idDepartamento;
        var idProvincia = Urls.idProvincia
        var idDistrito = Urls.idDistrito;
        var URLDepartamento = Urls.URLDepartamento;
        var URLProvincia = Urls.URLProvincia;
        var URLDistrito = Urls.URLDistrito;
        var CapaDepProvDist = Urls.CapaDepProvDist;

        //Cargando el ubigeo
        //Se obtiene los departamentos del pais
        _parent._getForm().off("change", idPais);


        if (_parent._getForm().find(idPais).val() != "PE") {
            _parent._getForm().find(idDepartamento).find("option").remove();
            _parent._getForm().find(idProvincia).find("option").remove();
            _parent._getForm().find(idDistrito).find("option").remove();
            _parent._getForm().find(CapaDepProvDist).fadeOut();
            //return false;
        } else {
            _parent._getForm().find(CapaDepProvDist).fadeIn();
        }

        _parent._getForm().on("change", idPais, function () {
            var obj = $(this);
            var objPais = $(this);


            if (objPais.val() != "PE") {
                _parent._getForm().find(idDepartamento).find("option").remove();
                _parent._getForm().find(idProvincia).find("option").remove();
                _parent._getForm().find(idDistrito).find("option").remove();
                _parent._getForm().find(CapaDepProvDist).fadeOut();
                return false;
            } else {
                _parent._getForm().find(CapaDepProvDist).fadeIn();
            }

            $.ajax({
                url: URLDepartamento,
                type: "POST",
                dataType: 'json',
                data: { idPais: objPais.val() },
                success: function (data) {
                    _parent._getForm().find(idDepartamento).find("option").remove();
                    _parent._getForm().find(idProvincia).find("option").remove();
                    _parent._getForm().find(idDistrito).find("option").remove();

                    // Fill sub category select 
                    var row = "<option value=\"\">SELECCIONE DEPARTAMENTO</option>";
                    $(row).appendTo(_parent._getForm().find(idDepartamento));
                    $.each(data, function (i, j) {
                        var row = "<option value=\"" + j.Dpto_Codigo + "\">" + j.Dpto_Nombre + "</option>";
                        $(row).appendTo(_parent._getForm().find(idDepartamento));
                    });
                }
            })
        });

        //Se obtiene las provincia del departamento
        _parent._getForm().off("change", idDepartamento);
        _parent._getForm().on("change", idDepartamento, function () {
            var obj = $(this);
            var objPais = _parent._getForm().find(idPais);
            var objDepartamento = $(this);

            $.ajax({
                url: URLProvincia,
                type: "POST",
                dataType: 'json',
                data: { idPais: objPais.val(), idDept: objDepartamento.val() },
                success: function (data) {

                    _parent._getForm().find(idProvincia).find("option").remove();
                    _parent._getForm().find(idDistrito).find("option").remove();

                    var row = "<option value=\"\">SELECCIONE PROVINCIA</option>";

                    $(row).appendTo(_parent._getForm().find(idProvincia));
                    $.each(data, function (i, j) {
                        var row = "<option value=\"" + j.Prov_Codigo + "\">" + j.Prov_Nombre + "</option>";
                        $(row).appendTo(_parent._getForm().find(idProvincia));
                    });
                }
            })
        });

        //Se obtiene los distritos de la provincia
        _parent._getForm().off("change", idProvincia);
        _parent._getForm().on("change", idProvincia, function () {
            var obj = $(this);
            var objPais = _parent._getForm().find(idPais);
            var objDepartamento = _parent._getForm().find(idDepartamento);
            var objProvincia = _parent._getForm().find(idProvincia);

            $.ajax({
                url: URLDistrito,
                type: "POST",
                dataType: 'json',
                data: { idPais: objPais.val(), idDept: objDepartamento.val(), idProv: objProvincia.val() },
                success: function (data) {

                    _parent._getForm().find(idDistrito).find("option").remove();

                    var row = "<option value=\"\">SELECCIONE DISTRITO</option>";

                    $(row).appendTo(_parent._getForm().find(idDistrito));
                    $.each(data, function (i, j) {
                        var row = "<option value=\"" + j.Dist_Codigo + "\">" + j.Dist_Nombre + "</option>";
                        $(row).appendTo(_parent._getForm().find(idDistrito));
                    });
                }
            });
        });
    }

}